
package com.tools.cleanmaster.model.db;

import android.content.Context;

import com.tools.cleanmaster.CleanApplication;
import com.tools.cleanmaster.store.DatabaseUpdateSharePrefManager;
import com.tools.cleanmaster.utils.FeatureConfig;
import com.tools.cleanmaster.utils.LogHelper;
import com.tools.cleanmaster.utils.TrashUtils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;

/**
 * 管理 TrashDB 预置 Asset 数据
 */
public class TrashDBPuller {
    static final String TAG = "TrashDBPuller";

    /**
     * 决定是否需要有 Asset 目录下的版本覆盖应用目录下的 TRASH_DB 文件
     * <p/>
     * 有两部分组成：
     * 1. 如果 DATABASE 的结构发生变化，则一定需要覆盖。
     * 2. 如果在 DATABASE 的结构没有变化，仍然因为需求需要覆盖，则修改其中的常量部分+1即可实现
     */
    private static final int DB_VERSION = 4 + TrashDB.DATABASE_VERSION; //Trash DB update version

    private static final String DB_ID_TRASH_DB = "oversea_trash_db";

    public static void copyAssetDb() {
        final Context context = CleanApplication.getInstance();

        final int localDataDbVersion = DatabaseUpdateSharePrefManager.getCurDbConfigVersion(CleanApplication.getInstance(),
                DB_ID_TRASH_DB,
                -1);

        if (localDataDbVersion == DB_VERSION) {
            if (FeatureConfig.DEBUG_LOG) {
                LogHelper.d(TAG, "Dot not need copy asset db!");
            }
            return;
        }

        File file = context.getDatabasePath(TrashDB.DATABASE_NAME);
        File parent = file.getParentFile();

        if (!parent.exists()) {
            parent.mkdirs();
        }
        InputStream myInput = null;
        OutputStream myOutput = null;
        File tempFile = null;
        try {
            //删除 可能是的目录，
            if (file.isDirectory()) {
                TrashUtils.deleteFile(file);
            } else if (file.exists()) {
                file.delete();
            }

            tempFile = File.createTempFile(TrashDB.DATABASE_NAME, null, parent);
            myInput = context.getAssets().open(TrashDB.DATABASE_NAME);
            myOutput = new FileOutputStream(tempFile);
            byte[] buffer = new byte[1024];
            int i = 0;
            while ((i = myInput.read(buffer)) > 0) {
                myOutput.write(buffer, 0, i);
            }
            myOutput.flush();

            //临时文件 重命名为 CTD文件。
            if (!tempFile.renameTo(file)) {
                throw new RuntimeException("renameTo failed");
            }
            DatabaseUpdateSharePrefManager.setCurDbConfigoVersion(context,
                    DB_ID_TRASH_DB, DB_VERSION);
        } catch (Exception e) {
            if (FeatureConfig.DEBUG_LOG) {
                throw new RuntimeException(e);
            }
        } finally {
            com.tools.cleanmaster.utils.Utils.closeQuietly(myInput);
            com.tools.cleanmaster.utils.Utils.closeQuietly(myOutput);
            if (null != tempFile && tempFile.exists()) {
                tempFile.delete();
            }
        }
    }
}

